本文记录使用docker搭建elasticsearch集群的整个过程(文中使用的2.1.2举例),过程亲测同样适用于elasticsearch2.x,5.x,后续作者将继续深入研究es,下一步准备基于此集群对源生elasticsearch(以下简称es)做改造测试。
1、 环境介绍
本文运行环境
ubuntu16.04
+docker17.05
+ 官网上下载的elasticsearch2.1.2
,另外docker环境为openjdk:8-jre-alpine
。(使用alpine的原因就是没有太多不必要的组件和命令,docker内部也不需要太多组件)
es源码下载地址
1.1 ubuntu
1 | $ cat /proc/version |
1.2 docker
1 | $ docker -v |
1.3 elasticsearch(版本忽略)
1 | $ ./elasticsearch -version |
2、 部署过程中遇到的问题
2.1 主要就是docker的网络配置,默认是桥接网络,不知为何多个node启动来之后无法互相发现。
解决方案:修改
elasticsearch.yml
配置。
2.2 每次重启docker实例docker自动会重新分配ip。
未解决。
3、 部署过程
3.1 制作生成es的dockerfile
.
参照dockerfile的git地址,如下图。
3.2 在es源文件中为es安装head
插件。
1 | $ plugin install mobz/elasticsearch-head |
3.3 生成es的docker镜像
镜像名称为
psiitoy/elasticsearch:2.1.2
。
1 | $ docker build -t psiitoy/elasticsearch:2.1.2 . |
3.4 查看已有网桥信息。
docker 默认使用
docker0
作为网桥
1 | $ brctl show |
3.5 查看网桥对应网段地址。
发现网段为172.17.0.x
1 | $ ip addr show docker0 |
3.6 修改elasticsearch.yml
配置。
避免docker容器es服务之间无法互相发现导致的脑裂。
参照Elasticsearch部分节点不能发现集群(脑裂)问题处理
1 | network.host: 0.0.0.0 |
3.7 创建docker容器x5。
docker run 参数介绍:
在使用-v
参数时,代表把本地目录挂载到镜像里,我们可以在本机查看容器中的/usr/share/elasticsearch/logs目录。
在使用-d
参数时,容器启动后会进入后台。
1 | $ docker run -d -v ~/usr/share/elasticsearch/logs:/usr/share/elasticsearch/logs psiitoy/elasticsearch:2.1.2 |
3.8 若想进入容器可以执行 docker exec -it $CONTAINER_ID
在使用
-i
参数时,打开STDIN,用于控制台交互
在使用-t
参数时,分配tty设备,该可以支持终端登录,默认为false
1 | $ docker exec -it 66ca0270ef44 /bin/bash |
3.9 查看集群状态
curl http://ip:port/_cat/health?v
,也可以用health?pretty
我们看到集群有5个节点加入了,实验成功!
1 | $ curl http://172.17.0.2:9200/_cat/health?v |
3.10 测试一下用客户端创建索引
创建一个
number_of_shards
为8,number_of_replicas
为1 的名叫twitter的index。
参照testClient的git地址
1 | public class ClientTest { |
3.11 查看head集群信息,成功了。
3.12 停止并删除所有docker容器
加
-f
参数强制停止删除
1 | $ docker rm -f $(docker ps -aq) |